home *** CD-ROM | disk | FTP | other *** search
/ Macwelt 1 / Macwelt DVD 1.toast / Software für Mac-OS X / Entwickler-Tools / netbeans / modules / ext / djava.jar / koala / dynamicjava / interpreter / TreeCompiler.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-03-14  |  5.8 KB  |  168 lines

  1. package koala.dynamicjava.interpreter;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import koala.dynamicjava.classinfo.ClassInfo;
  9. import koala.dynamicjava.classinfo.TreeClassInfo;
  10. import koala.dynamicjava.interpreter.context.Context;
  11. import koala.dynamicjava.interpreter.context.GlobalContext;
  12. import koala.dynamicjava.interpreter.error.ExecutionError;
  13. import koala.dynamicjava.parser.wrapper.ParserFactory;
  14. import koala.dynamicjava.parser.wrapper.SourceCodeParser;
  15. import koala.dynamicjava.tree.Node;
  16. import koala.dynamicjava.tree.TypeDeclaration;
  17. import koala.dynamicjava.util.ImportationManager;
  18. import koala.dynamicjava.util.LibraryFinder;
  19.  
  20. public class TreeCompiler {
  21.    protected Interpreter interpreter;
  22.    protected TreeClassLoader classLoader;
  23.    protected ClassInfoLoader classInfoLoader;
  24.    protected ClassPool classPool = new ClassPool();
  25.  
  26.    public Class compile(String var1) throws ClassNotFoundException {
  27.       this.loadClass(var1);
  28.       return this.compileClasses(var1);
  29.    }
  30.  
  31.    public Class compileClasses(String var1) throws ClassNotFoundException {
  32.       Class var2 = null;
  33.       ClassInfo var3;
  34.       if (this.classPool.contains(var1)) {
  35.          while((var3 = this.classPool.getFirstCompilable()) != null) {
  36.             if (!this.classExists(var3.getName())) {
  37.                Class var4 = this.compileClass(var3, var1);
  38.                if (var4 != null) {
  39.                   var2 = var4;
  40.                }
  41.             } else {
  42.                var3.setCompilable(false);
  43.             }
  44.          }
  45.       }
  46.  
  47.       if (var2 == null) {
  48.          throw new ClassNotFoundException(var1);
  49.       } else {
  50.          return var2;
  51.       }
  52.    }
  53.  
  54.    public Class compileTree(Context var1, TypeDeclaration var2) {
  55.       TreeClassFinder var3 = new TreeClassFinder(var1, this.interpreter, this.classPool);
  56.       TreeClassInfo var4 = new TreeClassInfo(var2, var3);
  57.       this.classPool.add(var4.getName(), var4);
  58.  
  59.       try {
  60.          return this.compileClasses(var4.getName());
  61.       } catch (ClassNotFoundException var6) {
  62.          var2.setProperty("errorStrings", new String[]{var2.getName()});
  63.          throw new ExecutionError("undefined.or.defined.class", var2);
  64.       }
  65.    }
  66.  
  67.    protected Class compileClass(ClassInfo var1, String var2) {
  68.       Class var3 = null;
  69.       ClassInfo var4 = var1.getSuperclass();
  70.       if (var4.isCompilable() && !this.classExists(var4.getName())) {
  71.          Class var5 = this.compileClass(var4, var2);
  72.          if (var5 != null) {
  73.             var3 = var5;
  74.          }
  75.       }
  76.  
  77.       ClassInfo[] var9 = var1.getInterfaces();
  78.  
  79.       for(int var6 = 0; var6 < var9.length; ++var6) {
  80.          var4 = var9[var6];
  81.          if (var4.isCompilable() && !this.classExists(var4.getName())) {
  82.             Class var7 = this.compileClass(var4, var2);
  83.             if (var7 != null) {
  84.                var3 = var7;
  85.             }
  86.          }
  87.       }
  88.  
  89.       Class var10 = (new ClassInfoCompiler(var1)).compile();
  90.       var1.setCompilable(false);
  91.       if (var2.equals(var10.getName())) {
  92.          var3 = var10;
  93.       }
  94.  
  95.       return var3;
  96.    }
  97.  
  98.    protected boolean classExists(String var1) {
  99.       return this.classLoader.hasDefined(var1);
  100.    }
  101.  
  102.    protected void loadClass(String var1) throws ClassNotFoundException {
  103.       if (!this.classPool.contains(var1)) {
  104.          TypeDeclaration var2 = this.classLoader.getTree(var1);
  105.          if (var2 != null) {
  106.             ImportationManager var14 = (ImportationManager)var2.getProperty("importationManager");
  107.             GlobalContext var16 = new GlobalContext(this.interpreter, this.classInfoLoader);
  108.             var14.setClassLoader(this.classInfoLoader);
  109.             var16.setImportationManager(var14);
  110.             TreeClassFinder var18 = new TreeClassFinder(var16, this.interpreter, this.classPool);
  111.             this.classPool.add(var1, new TreeClassInfo(var2, var18));
  112.          } else {
  113.             LibraryFinder var3 = this.interpreter.getLibraryFinder();
  114.  
  115.             try {
  116.                String var4 = var3.findCompilationUnitName(var1);
  117.                var2 = this.classLoader.getTree(var4);
  118.                if (var2 != null) {
  119.                   ImportationManager var17 = (ImportationManager)var2.getProperty("importationManager");
  120.                   GlobalContext var19 = new GlobalContext(this.interpreter, this.classInfoLoader);
  121.                   var17.setClassLoader(this.classInfoLoader);
  122.                   var19.setImportationManager(var17);
  123.                   TreeClassFinder var20 = new TreeClassFinder(var19, this.interpreter, this.classPool);
  124.                   this.classPool.add(var4, new TreeClassInfo(var2, var20));
  125.                   return;
  126.                }
  127.             } catch (ClassNotFoundException var11) {
  128.             }
  129.  
  130.             try {
  131.                File var15 = var3.findCompilationUnit(var1);
  132.                FileInputStream var5 = new FileInputStream(var15);
  133.                ParserFactory var6 = this.interpreter.getParserFactory();
  134.                SourceCodeParser var7 = var6.createParser(var5, var15.getCanonicalPath());
  135.                List var8 = var7.parseCompilationUnit();
  136.                Iterator var9 = var8.iterator();
  137.                CompilationUnitVisitor var10000 = new CompilationUnitVisitor;
  138.                if (this == null) {
  139.                   throw null;
  140.                } else {
  141.                   var10000.<init>(this);
  142.                   CompilationUnitVisitor var10 = var10000;
  143.  
  144.                   while(var9.hasNext()) {
  145.                      ((Node)var9.next()).acceptVisitor(var10);
  146.                   }
  147.  
  148.                }
  149.             } catch (IOException var12) {
  150.                throw new ClassNotFoundException(var1);
  151.             }
  152.          }
  153.       }
  154.    }
  155.  
  156.    public TreeCompiler(Interpreter var1) {
  157.       this.interpreter = var1;
  158.       this.classLoader = (TreeClassLoader)this.interpreter.getClassLoader();
  159.       ClassInfoLoader var10001 = new ClassInfoLoader;
  160.       if (this == null) {
  161.          throw null;
  162.       } else {
  163.          var10001.<init>(this);
  164.          this.classInfoLoader = var10001;
  165.       }
  166.    }
  167. }
  168.